package cn.liit.weixin.auth.utils;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;


import java.util.Map;

import name.zbq.bush.exception.ParamErrorException;
import name.zbq.bush.utils.StringUtil;
import name.zbq.bush.utils.http.HttpConnect;
import cn.liit.weixin.core.config.Config;

public class AuthUtil {
	
	/**
	 * 获取用户授权code的api url
	 * @param redirectUrl 授权后重定向的回调链接地址，请使用urlencode对链接进行处理(方法内已经处理过)
	 * @param state 重定向后会带上state参数，开发者可以填写a-zA-Z0-9的参数值，最多128字节
	 * @return 授权code 的api url
	 * @throws UnsupportedEncodingException 
	 */
	public static String auth_code_url(String redirectUrl,String state){
		String apiurl = null;
		try {
			apiurl = "https://open.weixin.qq.com/connect/oauth2/authorize?"
								+"appid="+Config.appid
								+"&redirect_uri="+URLEncoder.encode(redirectUrl,"UTF-8")
								+"&response_type=code"
								+"&scope=snsapi_base"
								+"&state="+state //可选
								+"#wechat_redirect";
		} catch (Exception e) {
			e.printStackTrace();
		}
		return apiurl;
	}
	/**
	 * 获取用户授权code的api url
	 * @param redirectUrl 授权后重定向的回调链接地址，请使用urlencode对链接进行处理(方法内已经处理过)
	 * @param state 重定向后会带上state参数，开发者可以填写a-zA-Z0-9的参数值，最多128字节
	 * @return 授权code 的api url
	 * @throws UnsupportedEncodingException 
	 */
	public static String auth_code_url_usrinfo(String redirectUrl,String state){
		String apiurl = null;
		try {
			apiurl = "https://open.weixin.qq.com/connect/oauth2/authorize?"
								+"appid="+Config.appid
								+"&redirect_uri="+URLEncoder.encode(redirectUrl,"UTF-8")
								+"&response_type=code"
								+"&scope=snsapi_userinfo"
								+"&state="+state //可选
								+"#wechat_redirect";
		} catch (Exception e) {
			e.printStackTrace();
		}
		return apiurl;
	}
	/**
	 * 通过code换取网页授权access_token
	 * @param code 用户授权后获得的code
	 * @return 
	 * 正确时的返回参数<br/>
	 * {
		   "access_token":"ACCESS_TOKEN",
		   "expires_in":7200,
		   "refresh_token":"REFRESH_TOKEN",
		   "openid":"OPENID",
		   "scope":"SCOPE",
		   "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
		}
		错误时返回数据<br/>
		{"errcode":40029,"errmsg":"invalid code"}
	 * @throws Exception 
	 */
	public static Map<String,Object> auth_accessToken_url(String code){
		if(StringUtil.isEmpty(code))new ParamErrorException("code must be not null");
		String apiurl = "https://api.weixin.qq.com/sns/oauth2/access_token?"
				+"appid="+Config.appid
				+"&secret="+Config.appsecret
				+"&code="+code
				+"&grant_type=authorization_code";
		Map<String,Object> resultMap = HttpConnect.getInstance().doGetJson(apiurl,null,"UTF-8");
		return resultMap;
	}
	/**
	 * 拉取用户信息
	 * 如果网页授权作用域为snsapi_userinfo，则此时开发者可以通过access_token和openid拉取用户信息了。
	 * @param accesstoken 网页授权接口调用凭证,注意：此access_token与基础支持的access_token不同
	 * @param openid 用户的唯一标识
	 * @param 返回国家地区语言版本，zh_CN 简体，zh_TW 繁体，en 英语
	 * @return 正确时的返回说明<br/>
	 * {
		   "openid":" OPENID",
		   " nickname": NICKNAME,
		   "sex":"1", 用户的性别，值为1时是男性，值为2时是女性，值为0时是未知
		   "province":"PROVINCE"
		   "city":"CITY",
		   "country":"COUNTRY",国家，如中国为CN
		    "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", 用户头像，最后一个数值代表正方形头像大小（有0、46、64、96、132数值可选，0代表640*640正方形头像），用户没有头像时该项为空。若用户更换头像，原有头像URL将失效。
			"privilege":[
				"PRIVILEGE1"
				"PRIVILEGE2"
		    ],用户特权信息，json 数组，如微信沃卡用户为（chinaunicom）
		    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" 只有在用户将公众号绑定到微信开放平台帐号后
		}
		错误时的返回数据<br/>
		{"errcode":40003,"errmsg":" invalid openid "}
	 */
	public static Map<String,Object> auth_userinfo_url(String accesstoken,String openid,String lang){
		if(StringUtil.isEmpty(accesstoken))throw new ParamErrorException("accesstoken must be not null");
		if(StringUtil.isEmpty(openid))throw new ParamErrorException("openid must be not null");
		lang = StringUtil.isEmpty(lang) ? "zh_CN" : lang;
		String apiurl = "https://api.weixin.qq.com/sns/userinfo?access_token="+accesstoken+"&openid="+openid+"&lang="+lang;
		Map<String,Object> resultMap = HttpConnect.getInstance().doGetJson(apiurl,null,"UTF-8");
		return resultMap;
	}
	
	public static void main(String[] args) throws Exception {
		String url = AuthUtil.auth_code_url("http://192.168.0.9/download/material", 2+"");
		System.out.println(url);
	}
	
}
